#!/usr/bin/env python
# -*- coding:utf-8 -*-

from django.core.files.storage import Storage
from django.conf import settings

from fdfs_client.client import Fdfs_client
from django.utils.deconstruct import deconstructible


@deconstructible
class MyStorage(Storage):
    # Django必须能够在没有任何参数的情况下实例化您的存储系统。这意味着任何设置都应该来自django.conf.settings：
    # def __init__(self, option=None):
    #     if not option:
    #         option = settings.CUSTOM_STORAGE_OPTIONS

    # 您的存储类必须实现_open()
    # 和_save()
    # 方法以及适用于您的存储类的任何其他方法。有关这些方法的更多信息，请参见下
    #
    # 此外，如果您的类提供本地文件存储，则它必须覆盖该path()
    # 方法。

    def __init__(self, conf_path=None, ip=None):
        if conf_path is None:
            conf_path = settings.FDFS_CLIENT_CONF
        self.conf_path = conf_path

        if ip is None:
            ip = settings.FDFS_URL
        self.ip = ip

    def _open(self, name, mode='rb'):

        pass

    def _save(self, name, content, max_length=None):
        # name:只是上传图片的名字，并不是　路径
        # content:是上传的图片的二进制
        # １．创建fastdfs客户端，需要设置client.conf的路径
        client = Fdfs_client(self.conf_path)
        # ２．获取图片的二进制内容
        data = content.read()

        # 3. 通过客户端上传二进制数据
        # 返回上传的结果
        result = client.upload_by_buffer(data)

        if result.get("Status") == 'Upload successed.':
            return result.get('Remote file_ide')
        else:
            raise Exception("上传失败!!!")

    def exists(self, name):
        # 判断图片是否存在,因为fdfs已经做了图片不重名处理，所以尽管上传资源，资源不会重复也不会覆盖
        return False

    def url(self, name):

        return self.ip + name
